/********************************************************************************
*解析所有试题json数据，将树形结构的数据分解成线性数据
********************************************************************************/
var G_AllTest; // = new TestData(jsonAllTest); 
/********************************************************************************
函数名：OneTest
功能：一道试题的数据结构
输入参数: 无
返回值：无
创建信息：黎萍（2014-05-19）
修改记录：兰涛（2014-05-22）
审查人：韦友爱（2014-05-26）
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function OneTest() {
	this.testNO = 0;	//试题编号
	this.style = '';	//试题类型
	this.type = '';		//试题所属题型
	this.score = 0;	//每题分数

	//以下三个索引用于定位json中的对应数据
	this.styleItemIndex = 0;	// 题型ID,json数据中的StyleID
	this.testItemIndex = 0;	// 大标题ID,json数据中各种题型的ID
	this.subTestItemIndex = -1;	//小题ID,针对A3题型的A3TestItemIndex和B题型的BTestItemIndex; testNO 试题的编号

	//下面4个字段值用于记录用户在做题过程中的答题信息
	this.userReply = ''; //用户的答案
	this.isRight = false; //是否回答正确
	this.fav = false; //收藏
	this.userNote = ''; //用户笔记
	this.selected = 0;	//标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
	this.state = 'uncommited';	//标记当前试题是否提交了答案：true为已提交，commited为未提交
	this.lastState='';	//用户上一次操作试题的状态
	this.action = '';	//记录试题的当前操作
	this.lastAction = '';	//用户上一次操作试题的动作
	this.testID = '';	//试题id
}

/********************************************************************************
函数名：OneTestShow
功能：一道试题显示时的数据结构
输入参数：无
返回值：无
创建信息：兰涛（2014-05-28）
修改记录：黎萍（2014-05-28） 增加注释及函数体中属性的操作
修改记录：黎萍（2014-06-24） 增加输入参数AllTestID,StyleID 并增加注释
修改记录：黎萍（2014-07-03） 增加输入参数cptID,sbjID,srcID,subTestID 并增加注释
修改记录：黎萍（2014-07-04） 增加输入参数score并增加注释
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function OneTestShow() {
	this.cptID = 0; //章节ID
	this.sbjID = 0; //科目ID
	this.srcID = 0;	//来源ID
	this.allTestID = 0;	//试题的AllTestID
	this.styleID = 0;	//试题类型ID
	this.testNO = 0;	//试题编号
	this.testType = '';	//试题所属题型
	this.subTestType = '';	//小题所属题型
	this.testStyle = '';	//试题类型
	this.styleExplain = '';	//试题类型说明
	this.frontTitle = '';	//共用题干，针对A3Test
	this.title = '';	//试题标题
	this.selectedItems = '';	//试题选项
	this.answer = '';	//试题答案
	this.testPoint = '';	//考试重点
	this.explain = '';	//解题思路
	this.isFav = 0;	//是否收藏
	this.userNote = '';	//用户笔记
	this.subTestID = -1;	//小题id（针对A3题型、B题型）
	this.score = 0;	//每题分数
	this.time='';//时间
	this.answerType = 0;	//标记填空题答案是否按照顺序进行答案比对
}

/********************************************************************************
函数名：TestData
功能：试题数据
输入参数:无
返回值：无
创建信息：兰涛（2014-05-28）
修改记录：黎萍（2014-05-28） 增加函数注释
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function TestData() {

	//私有变量
	var _index = 0; //试题数组索引
	var _jsonAllTest = {}; //试题json数据
	var _arrAllTest = []; //试题数组:数组元素为OneTest结构体：通过TestNO找到StyleItemIndex,TestItemIndex,SubTestItemIndex，然后再定位到_jsonAllTest中的对应数据
	var _examHistoryID = '';	//答题历史ID
	var _shareUrl = '';	//共享生成的url
	var _testJson = '';
	var _fromUrl = G_Prg.getQueryString('fromUrl');
    var _time='';
	var _arrContrast=[];
    var _arrOtherNote=[];
	var _configJson = {};	//模拟考场配置json
	var _testTime;	//记录考试时间
	var _passScore = '';	//及格分数
	var _paperTitle = '';	//试卷名称
	var _totalScore = '';	//试题总分
	var _isReplay = false;//是否还原现场
	_init(); //初始化数据
	
	//私有函数
	/********************************************************************************
	函数名：_init
	功能：初始化试题数据
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-13） 添加函数注释
	修改记录：黎萍（2014-06-13） 去掉参数jsonAllTest
              韦友爱（2014-07-23）添加callback回调函数，添加从章节最终列表页跳转传来的type参数的判断
			  黎萍（2015-05-12）增加对执业护士的易混易错试题数据的获取控制
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _init() {
		var fromUrl = G_Prg.getQueryString('fromUrl');
		switch (fromUrl){
			case 'default.html':
				var type = G_Prg.getQueryString('type');
				switch (type){
					case 'practice'://练习模式
						var practiceID = G_Prg.getQueryString('practiceID');
						_paperTitle = G_Prg.getQueryString('practiceName',true);
						_jsonAllTest = _getAllExamJSON(practiceID);//获取试题json数据
						//_jsonAllTest = data;	//获取试题json数据
						break;
					case 'exam'://考试模式
						var examID = G_Prg.getQueryString('examID');
						_paperTitle = G_Prg.getQueryString('examName',true);
						_jsonAllTest = _getExamJSON(examID);//获取试题json数据
						//_jsonAllTest = data;	//获取试题json数据
						break;
					case 'examReplay'://考试结束查看成绩
						_isReplay = true;
						var examID = G_Prg.getQueryString('examID');
						_paperTitle = G_Prg.getQueryString('examName',true);
						_jsonAllTest = _getExamReplayJSON(examID);//获取试题json数据
						//_jsonAllTest = data;	//获取试题json数据
						break;
				}

		}
		//_jsonAllTest = _getAllTestJSON();//获取试题json数据
       // _jsonAllTest = data;	//获取试题json数据
		_initArrAllTest();	//初始化结构体数组
	}
	/********************************************************************************
	函数名：_initArrAllTest
	功能：初始化试题结构体数组
	输入参数: 无
	返回值：无
	创建信息：黎萍（2014-08-18）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	function _initArrAllTest(){
		if(_jsonAllTest === '' || !_jsonAllTest){
			return;
		}
		var index = 0; //数组Numbers的索引
		//题型数据获取异常
		var styleItems = _jsonAllTest.styleItems;
		if(styleItems.length === 0){
			G_Prg.throw('程序运行错误，TestData._initArrAllTest ：styleItems = "' + styleItems + '"，无法解析试题数据包！');
		}
		for (var i = 0; i < styleItems.length; i++) {
			var testType = styleItems[i].Type; //题型
			var testItems = styleItems[i].TestItems;
			/*if(!testItems.length){
			 G_Prg.throw('程序运行错误，TestData._initArrAllTest ：试题数据为空');
			 }*/
			for (var j = 0; j < testItems.length; j++) {
				/*
				 判断试题所属题型，调用对应的读取数据的函数
				 对结构体的属性进行赋值，同时生成数组的值
				 */
				if (testType === 'A3TEST') {
					var a3items = testItems[j].A3TestItems;
					/*if(!a3items.length){
					 G_Prg.throw('程序运行错误，TestData._initArrAllTest ：试题数据为空');
					 }*/
					for (var k = 0; k < a3items.length; k++) {
						//_arrAllTest[index] = new OneTest(i, j, k, index + 1);
						_arrAllTest[index] = new OneTest();
						_arrAllTest[index].styleItemIndex = i;
						_arrAllTest[index].testItemIndex = j;
						_arrAllTest[index].subTestItemIndex = k;
						_arrAllTest[index].testNO = index + 1;
						_arrAllTest[index].style = styleItems[i].Style;
						_arrAllTest[index].type = testType;
						_arrAllTest[index].score = styleItems[i].Score;
						_arrAllTest[index].testID = testItems[j].AllTestID;
						_arrContrast[index]=parseInt(testItems[j].AllTestID+''+a3items[k].A3TestItemID);
						index++;
					}
				} else if (testType === 'BTEST') {
					var bitems = testItems[j].BTestItems;
					/*if(!bitems.length){
					 G_Prg.throw('程序运行错误，TestData._initArrAllTest ：试题数据为空');
					 }*/
					for (var k = 0; k < bitems.length; k++) {
						//_arrAllTest[index] = new OneTest(i, j, k, index + 1);
						_arrAllTest[index] = new OneTest();
						_arrAllTest[index].styleItemIndex = i;
						_arrAllTest[index].testItemIndex = j;
						_arrAllTest[index].subTestItemIndex = k;
						_arrAllTest[index].testNO = index + 1;
						_arrAllTest[index].style = styleItems[i].Style;
						_arrAllTest[index].type = testType;
						_arrAllTest[index].score = styleItems[i].Score;
						_arrAllTest[index].testID = testItems[j].AllTestID;
						_arrContrast[index]=parseInt(testItems[j].AllTestID+''+bitems[k].BTestItemID);
						index++;
					}
				} else if (testType === 'ATEST' || testType === 'JDTEST' || testType === 'PDTEST' || testType === 'TKTEST' || testType === 'XTEST') {
					//_arrAllTest[index] = new OneTest(i, j, -1, index + 1);
					_arrAllTest[index] = new OneTest();
					_arrAllTest[index].styleItemIndex = i;
					_arrAllTest[index].testItemIndex = j;
					_arrAllTest[index].testNO = index + 1;
					_arrAllTest[index].style = styleItems[i].Style;
					_arrAllTest[index].type = testType;
					_arrAllTest[index].score = styleItems[i].Score;
					_arrAllTest[index].testID = testItems[j].AllTestID;
					_arrContrast[index]=testItems[j].AllTestID;
					index++;
				} else {
					G_Prg.throw('程序运行错误，TestData._initArrAllTest ：testType = "' + testType + '"，无法解析题型');
				}
			} //end for testItems
		} //end for styleItem	
		_setReplayArrAllTest();
	}
	/********************************************************************************
	函数名：_setReplayArrAllTest
	功能：查看考试情况，设置的试题结构体数组中用户答题信息
	输入参数: 无
	返回值：无
	创建信息：黎萍（2016-02-16）
	修改记录：无
	 *******************************************************************************/
	function _setReplayArrAllTest(){
		var type = G_Prg.getQueryString('type');
		if(type !== 'examReplay'){
			return;
		}
		var userInfos = _jsonAllTest.userInfo;
		var dataLen = _arrAllTest.length;
		var dataLen2 = userInfos.length;
		for(var i = 0; i < dataLen; i++){
			var testID = _arrAllTest[i].testID;
			for(var j = 0; j < dataLen2;j++){
				if(testID === userInfos[j].testID){
					_arrAllTest[i].userReply = userInfos[j].anwerContent;
					if(userInfos[j].isRight === 1){
						_arrAllTest[i].isRight = 0;
					}else{
						_arrAllTest[i].isRight = 1;
					}
					_arrAllTest[i].state = 'marked';
				}
			}//end for userInfos
		} //end for _arrAllTest
	}
	/********************************************************************************
	函数名：_getAllExamJSON
	功能：通过ajax获取指定练习的试题json数据
	输入参数: 无
	返回值：章节试题json数据
	创建信息：韦友爱（2015-10-28）
	修改记录：无
	 *******************************************************************************/
	function _getAllExamJSON(practiceID) {
        var params={
			practiceID : practiceID
        };
		var jsonData = ''; 	//试题json数据 
		var URL='/student/practice/test';
		var success=function(json){
			var jsonObj = JSON.parse(json);
			if (jsonObj.status === 200) {	//200 获取数据成功
				//字符串转json对象
				console.log(jsonObj);
				jsonData = jsonObj.data;
			}else{	
				G_Prg.throwErr('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "'+jsonObj.status+'"！');
			}
		};  
		G_AjaxApi.getByParam(URL,params,false,success);
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);
		return jsonData;
	}
	/********************************************************************************
	 函数名：_getAllExamJSON
	 功能：通过ajax获取指定练习的试题json数据
	 输入参数: 无
	 返回值：章节试题json数据
	 创建信息：韦友爱（2015-10-28）
	 修改记录：无
	 *******************************************************************************/
	function _getExamJSON(examID) {
		var params={
			examID : examID
		};
		var jsonData = ''; 	//试题json数据
		var URL='/student/exam/test';
		var success=function(json){
			var jsonObj = JSON.parse(json);
			if (jsonObj.status === 200) {	//200 获取数据成功
				//字符串转json对象
				console.log(jsonObj);
				jsonData = jsonObj.data;
				_testTime = jsonObj.data.leftTime;
			}else{
				G_Prg.throwErr('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "'+jsonObj.status+'"！');
			}
		};
		G_AjaxApi.getByParam(URL,params,false,success);
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);
		return jsonData;
	}
	/********************************************************************************
	 函数名：_getExamReplayJSON
	 功能：通过ajax获取指定考试的试题json数据
	 输入参数: examID 考试ID
	 返回值：章节试题json数据
	 创建信息：韦友爱（2016-02-16）
	 修改记录：无
	 *******************************************************************************/
	function _getExamReplayJSON(examID) {
		var params={
			examID : examID
		};
		var jsonData = ''; 	//试题json数据
		var URL='/student/uc/exam/detail';
		var success=function(json){
			var jsonObj = JSON.parse(json);
			if (jsonObj.status === 200) {	//200 获取数据成功
				//字符串转json对象
				console.log(jsonObj);
				jsonData = jsonObj.data;
				_testTime = jsonObj.data.leftTime;
			}else{
				G_Prg.throwErr('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "'+jsonObj.status+'"！');
			}
		};
		G_AjaxApi.getByParam(URL,params,false,success);
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);
		return jsonData;
	}
	/********************************************************************************
	 函数名：_getAllTestJSON
	 功能：通过ajax获取指定作业的试题json数据
	 输入参数: appID 软件ID
	 返回值：章节试题json数据
	 创建信息：黎萍（2014-06-18）
	 修改记录：无
	 *******************************************************************************/
	function _getAllTestJSON() {
		var userID = G_Cookie.getUserID()
		if (!userID) {
			G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON ：userID = "' + userID + '"，获取数据异常');
			return;
		};
		var examID = G_Prg.getQueryString('examID');
		var params={
			examID : examID,
			userID : userID
		};
		var jsonData = ''; 	//试题json数据
		var URL='/api/doExam/examinfoconfirm/getonlinestudyTestInfo';
		var success=function(json){
			var jsonObj = JSON.parse(json);
			if (jsonObj.Status === 200) {	//200 获取数据成功
				//字符串转json对象
				jsonData = jsonObj.Data;
				_passScore = jsonObj.Data.PassScore;
				//_testTime = jsonObj.Data.SpendTime;//在线作业，不取考试时间
				_paperTitle = jsonObj.Data.PaperTitle;
				_totalScore = jsonObj.Data.TotalScore;
				_examHistoryID = jsonObj.Data.ExamResultID;
			}else if (jsonObj.Status === 300) {	//300 连接数据库失败
				G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
			}else if (jsonObj.Status === 201) {	//201 没有数据；
				G_Prg.throwErr('程序运行错误，没有您要查找的试题数据！');
			}else{
				G_Prg.throwErr('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "'+jsonObj.status+'"！');
			}
		};
		G_AjaxApi.post(URL,params,false,success);
		var userInfo = _getUserInfo(userID,examID);
		jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData,userInfo);
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);
		return jsonData;
	}
	/********************************************************************************
	 函数名：_getUserError
	 功能：通过ajax获取错题列表json数据
	 输入参数: curPage 当前页,showCount 每页要显示的题目数量
	 返回值：错题列表json数据
	 创建信息：韦友爱（2015-09-24）
	 修改记录：无
	 *******************************************************************************/
	function _getUserError(curPage,showCount) {
		var userID = G_Cookie.getUserID()
		if (!userID) {
			G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON ：userID = "' + userID + '"，获取数据异常');
			return;
		};
		var params={
			userID: G_Cookie.getUserID(),
			curPage:curPage-1,
			eachPageNum:showCount
		};
		var jsonData = ''; 	//试题json数据
		var userData = '';
		var URL='/userGather/answer/errorList';
		var success=function(json){
			var jsonObj = json;
			if (jsonObj.status === 200) {	//200 获取数据成功
				//字符串转json对象
				jsonData = jsonObj.data.test;
				userData = jsonObj.data.info;
				_paperTitle = '错题重做';
			}else if (jsonObj.status === 300) {	//300 连接数据库失败
				G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
			}else if (jsonObj.status === 201) {	//201 没有数据；
				G_Prg.throwErr('程序运行错误，没有您要查找的试题数据！');
			}else{
				G_Prg.throwErr('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "'+jsonObj.status+'"！');
			}
		};
		G_AjaxApi2.getByParams(URL,params,false,success);
		jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData,userData);
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);
		return jsonData;
	}
	/********************************************************************************
	 函数名：_getUserFav
	 功能：通过ajax获取收藏列表json数据
	 输入参数: curPage 当前页,showCount 每页要显示的题目数量
	 返回值：收藏列表json数据
	 创建信息：韦友爱（2015-09-24）
	 修改记录：无
	 *******************************************************************************/
	function _getUserFav(curPage,showCount) {
		var userID = G_Cookie.getUserID()
		if (!userID) {
			G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON ：userID = "' + userID + '"，获取数据异常');
			return;
		};
		var params={
			userID: G_Cookie.getUserID(),
			curPage:curPage-1,
			eachPageNum:showCount
		};
		var jsonData = ''; 	//试题json数据
		var userData = '';
		var URL='/userGather/fav/list';
		var success=function(json){
			var jsonObj = json;
			if (jsonObj.status === 200) {	//200 获取数据成功
				//字符串转json对象
				jsonData = jsonObj.data.test;
				userData = jsonObj.data.info;
				_paperTitle = '我的收藏';
			}else if (jsonObj.status === 300) {	//300 连接数据库失败
				G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
			}else if (jsonObj.status === 201) {	//201 没有数据；
				G_Prg.throwErr('程序运行错误，没有您要查找的试题数据！');
			}else{
				G_Prg.throwErr('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "'+jsonObj.status+'"！');
			}
		};
		G_AjaxApi2.getByParams(URL,params,false,success);
		jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData,userData);
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);
		return jsonData;
	}
	/********************************************************************************
	 函数名：_getUserNote
	 功能：通过ajax获取笔记列表json数据
	 输入参数: curPage 当前页,showCount 每页要显示的题目数量
	 返回值：笔记列表json数据
	 创建信息：韦友爱（2015-09-24）
	 修改记录：无
	 *******************************************************************************/
	function _getUserNote(curPage,showCount) {
		var userID = G_Cookie.getUserID()
		if (!userID) {
			G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON ：userID = "' + userID + '"，获取数据异常');
			return;
		};
		var params={
			userID: G_Cookie.getUserID(),
			curPage:curPage-1,
			eachPageNum:showCount
		};
		var jsonData = ''; 	//试题json数据
		var userData = '';
		var URL='/userGather/note/list';
		var success=function(json){
			var jsonObj = json;
			if (jsonObj.status === 200) {	//200 获取数据成功
				//字符串转json对象
				jsonData = jsonObj.data.test;
				userData = jsonObj.data.info;
				_paperTitle = '我的笔记';
			}else if (jsonObj.status === 300) {	//300 连接数据库失败
				G_Prg.throwErr('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
			}else if (jsonObj.status === 201) {	//201 没有数据；
				G_Prg.throwErr('程序运行错误，没有您要查找的试题数据！');
			}else{
				G_Prg.throwErr('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "'+jsonObj.status+'"！');
			}
		};
		G_AjaxApi2.getByParams(URL,params,false,success);
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);
		jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData,userData);
		return jsonData;
	}
	/********************************************************************************
	 函数名：_getAtest
	 功能：获取Atest型题试题信息
	 输入参数:curTest 当前试题数组
	 返回值：单题试题对象
	 创建信息：黎萍（2014-05-28）
	 修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	 修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	 修改记录：黎萍（2014-07-04） 增加试题信息：score
	 修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	 修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	 审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getAtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的ATestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.styleItems;
		var testItems = styleItems[styleItemIndex].TestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
		oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
		oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		var explain = testItems[testItemIndex].Explain; //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint; //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //选项
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日');//时间
		return oneTestShow;
	}
	/********************************************************************************
	 函数名：_getA3test
	 功能：获取A3test型题试题信息
	 输入参数:curTest 当前试题数组
	 返回值：单题试题对象
	 创建信息：黎萍（2014-05-28）
	 修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	 修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	 修改记录：黎萍（2014-07-04） 增加试题信息：score
	 修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	 修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	 审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getA3test(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的A3TestID
		var subTestItemIndex = curTest.subTestItemIndex; //小题ID,针对A3题型的A3TestItemIndex
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.styleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
		var A3TestItems = testItems[testItemIndex].A3TestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.subTestType = styleItems[styleItemIndex].SubType === undefined ? '单项' : styleItems[styleItemIndex].SubType; //选项类型，值有：空，单项，多项，不定项
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
		oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
		oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.frontTitle = testItems[testItemIndex].FrontTitle; //共用主标题
		oneTestShow.isFav = A3TestItems[subTestItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = A3TestItems[subTestItemIndex].UserNoteContent; //是否收藏
		oneTestShow.subTestID = A3TestItems[subTestItemIndex].A3TestItemID;
		oneTestShow.answer = A3TestItems[subTestItemIndex].Answer; //答案
		oneTestShow.title = A3TestItems[subTestItemIndex].Title; //小标题
		var explain = A3TestItems[subTestItemIndex].Explain; //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = A3TestItems[subTestItemIndex].TestPoint; //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.selectedItems = A3TestItems[subTestItemIndex].SelectedItems; //选项
		oneTestShow.time=G_Prg.datetimeFormat(new Date(A3TestItems[subTestItemIndex].NoteTime), 'MM月dd日');//时间

		return oneTestShow;
	}
	/********************************************************************************
	 函数名：_getBtest
	 功能：获取Btest型题试题信息
	 输入参数:curTest 当前试题数组
	 返回值：单题试题对象
	 创建信息：黎萍（2014-05-28）
	 修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	 修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	 修改记录：黎萍（2014-07-04） 增加试题信息：score
	 修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	 修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	 审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getBtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的BTestID
		var subTestItemIndex = curTest.subTestItemIndex; //小题ID,针对B题型的BTestItemIndex
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.styleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
		var BTestItems = testItems[testItemIndex].BTestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		var subType = styleItems[styleItemIndex].SubType;
		if(!subType||subType===''){
			subType='单项';
		}
		oneTestShow.subTestType = subType; //选项类型，值有：空，单项，多项，不定项
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型定项
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
		oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
		oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //共用选项
		oneTestShow.isFav = BTestItems[subTestItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = BTestItems[subTestItemIndex].UserNoteContent; //用户笔记
		oneTestShow.subTestID = BTestItems[subTestItemIndex].BTestItemID;
		oneTestShow.answer = BTestItems[subTestItemIndex].Answer; //答案
		oneTestShow.title = BTestItems[subTestItemIndex].Title; //小标题
		var explain = testItems[testItemIndex].Explain; //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		//var explain = BTestItems[subTestItemIndex].Explain; //解题思路
		//oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = BTestItems[subTestItemIndex].TestPoint; //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.time=G_Prg.datetimeFormat(new Date(BTestItems[subTestItemIndex].NoteTime), 'MM月dd日');//时间

		return oneTestShow;
	}
	/********************************************************************************
	 函数名：_getJDtest
	 功能：获取JDtest型题试题信息
	 输入参数:curTest 当前试题数组
	 返回值：单题试题对象
	 创建信息：黎萍（2014-05-28）
	 修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	 修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	 修改记录：黎萍（2014-07-04） 增加试题信息：score
	 修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	 修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	 审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getJDtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的JDTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.styleItems;
		var testItems = styleItems[styleItemIndex].TestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
		oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
		oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain; //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint; //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日');//时间

		return oneTestShow;
	}
	/********************************************************************************
	 函数名：_getPDtest
	 功能：获取PDtest型题试题信息
	 输入参数:curTest 当前试题数组
	 返回值：单题试题对象
	 创建信息：黎萍（2014-05-28）
	 修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	 修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	 修改记录：黎萍（2014-07-04） 增加试题信息：score
	 修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	 修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	 审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getPDtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的PDTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.styleItems;
		var testItems = styleItems[styleItemIndex].TestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
		oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
		oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain; //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint; //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日');//时间
		selectedItems = [{Content: "对",ItemName: "A"},{Content: "错",ItemName: "B"}];
		oneTestShow.selectedItems = selectedItems; //选项

		return oneTestShow;
	}
	/********************************************************************************
	 函数名：_getTKtest
	 功能：获取TKtest型题试题信息
	 输入参数:curTest 当前试题数组
	 返回值：单题试题对象
	 创建信息：黎萍（2014-05-28）
	 修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	 修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	 修改记录：黎萍（2014-07-04） 增加试题信息：score
	 修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	 修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	 审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getTKtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的TKTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.styleItems;
		var testItems = styleItems[styleItemIndex].TestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
		oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
		oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain; //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint; //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		var answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.answer = G_SetTestInfo.splitTKTestAnswer(answer); //先进行选项分隔
		oneTestShow.answerType = testItems[testItemIndex].AnswerType;	//答案比较顺序
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日');//时间

		return oneTestShow;
	}
	/********************************************************************************
	 函数名：_getXtest
	 功能：获取Xtest型题试题信息
	 输入参数:curTest 当前试题数组
	 返回值：单题试题对象
	 创建信息：黎萍（2014-05-28）
	 修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	 修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	 修改记录：黎萍（2014-07-04） 增加试题信息：score
	 修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	 修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	 审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getXtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的XTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.styleItems;
		var testItems = styleItems[styleItemIndex].TestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
		oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
		oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain; //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint; //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //选项
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日');//时间

		return oneTestShow;
	}

	/********************************************************************************
	以下为公共变量、公共函数
	 *******************************************************************************/
	
	/********************************************************************************
	函数名：getIsVip
	功能：获取标记是否是VIP用户的
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-07-09）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getExamHistoryID = function () {
		return _examHistoryID;
	};
	
	this.getTestTime = function (){
		return _testTime;	
	};
	this.getPassScore =  function(){
		return _passScore;	
	};
	this.getPaperTitle =  function(){
		return _paperTitle;	
	};
	this.getTotalScore =  function(){
		return _totalScore;	
	};
	/********************************************************************************
	函数名：getConfigJson
	功能：获取模拟考场配置json
	输入参数:无
	返回值：_configJson 模拟考场配置json
	创建信息：黎萍（2014-10-22）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getConfigJson = function () {
		return _configJson;
	};
	/********************************************************************************
	函数名：getArrAllTest
	功能：获取试题结构体数组
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-07-09）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getArrAllTest = function () {
		return _arrAllTest;
	};
	/********************************************************************************
	函数名：getJsonAllTest
	功能：获取试题
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-08-26）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getJsonAllTest = function () {
		return _jsonAllTest;
	};
	/********************************************************************************
	函数名：getCurIndex
	功能：获取当前试题的索引
	输入参数:无
	返回值：_index 当前试题的索引
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getCurIndex = function () {
		return _index; //试题的当前索引，从0开始
	};
	/********************************************************************************
	函数名：getTestCount
	功能：获取试题数量
	输入参数:无
	返回值： 试题数量
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getTestCount = function () {
        //if(!_arrAllTest.length){
        //    G_Prg.throwErr('试题数组为空，请联系客服QQ:4007278800！');
        //}
		return _arrAllTest.length; //试题数量
	};
	/********************************************************************************
	函数名：movePre
	功能：移动到上一题
	输入参数:无
	返回值：成功返回true，如果已经是第一题则返回false，操作页面对返回值进行判断，进行提示“已经是第一题”
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.movePre = function () {
		if (_index <= 0) {
			return false;
		} else {
			_index--;
			return true;
		}
	};
	/********************************************************************************
	函数名：moveNext
	功能：移动到下一题
	输入参数:无
	返回值：成功返回true，如果已经是第一题则返回false，操作页面对返回值进行判断，进行提示"已经是最后一题"
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.moveNext = function () {
		if (_index >= (_arrAllTest.length - 1)) {
			return false;
		} else {
			_index++;
			return true;
		}
	};
	/********************************************************************************
	函数名：move
	功能：移动到指定的答题卡上题号
	输入参数:index 试题数组索引
	返回值：成功返回true，如果已经是第一题则返回false
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.move = function (index) {
		if ((index < 0) || (index >= _arrAllTest.length)) {
			return false;
		} else {
			_index = index;
			return true;
		}
	};
	/********************************************************************************
	函数名：setUserReply
	功能：设置用户的答案
	输入参数:	userReply 用户输入的答案
	返回值：无
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.setUserReply = function (userReply) {
		_arrAllTest[_index].userReply = userReply;
	};
	/********************************************************************************
	函数名：getUserReply
	功能：获取用户的答案
	输入参数:	index 试题数组索引
	返回值：用户的答案
	创建信息：黎萍（2014-06-10）
	修改记录：无
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getUserReply = function (index) {
		return _arrAllTest[index].userReply;
	};
	/********************************************************************************
	函数名：setIsRight
	功能：设置用户答题是否正确
	输入参数:	isRight 标记用户回答是否正
	返回值：无
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.setIsRight = function (isRight) {
		_arrAllTest[_index].isRight = isRight;
	};
	/********************************************************************************
	函数名：getIsRight
	功能：获取用户答题是否正确
	输入参数:	index 试题数组索引
	返回值：用户的答案
	创建信息：黎萍（2014-06-10）
	修改记录：无
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getIsRight = function (index) {
		return _arrAllTest[index].isRight;
	};
	/********************************************************************************
	函数名：setSelected
	功能：设置标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
	输入参数:	selected 标记值
	返回值：无
	创建信息：黎萍（2014-08-06）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.setSelected = function (selected) {
		_arrAllTest[_index].selected = selected;
	};
	/********************************************************************************
	函数名：getSelected
	功能：获取标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
	输入参数:	index 试题数组索引
	返回值：标记值
	创建信息：黎萍（2014-08-06）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getSelected = function (index) {
		return _arrAllTest[index].selected;
	};
	/********************************************************************************
	函数名：setState
	功能：设置用户操作试题的状态
	输入参数:	state 标记值
	返回值：无
	创建信息：黎萍（2014-09-01）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.setState = function (state,flag) {
		if(!flag){
			_arrAllTest[_index].lastState = _arrAllTest[_index].state ;
			_arrAllTest[_index].state = state;
		}else{
			for(var i = 0; i < _arrAllTest.length; i++){
				_arrAllTest[i].lastState = _arrAllTest[i].state ;
				_arrAllTest[i].state = state;
			}
		}
	};
	/********************************************************************************
	函数名：getState
	功能：获取标记当前试题是否提交了答案
	输入参数:	index 试题数组索引
	返回值：标记值
	创建信息：黎萍（2014-09-01）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getState = function (index) {
		return _arrAllTest[index].state;
	};
	/********************************************************************************
	函数名：setAction
	功能：设置用户操作试题的动作
	输入参数:	actionName 操作试题的动作,flag 标记是否将所有试题都标记为此动作
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.setAction = function(actionName,flag){
		if(!flag){
			_arrAllTest[_index].lastAction = _arrAllTest[_index].action;			
			_arrAllTest[_index].action = actionName;
		}else{
			for(var i = 0; i < _arrAllTest.length; i++){
				_arrAllTest[i].lastAction = _arrAllTest[i].action;	
				_arrAllTest[i].action = actionName;
			}
		}
    };
	/********************************************************************************
	函数名：recoverState
	功能：恢复用户之前操作试题的状态
	输入参数:	无
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.recoverState = function(){
		for(var i = 0; i < _arrAllTest.length; i++){
			_arrAllTest[i].state = _arrAllTest[i].lastState ;
		}
	};
	/********************************************************************************
	函数名：getLastState
	功能：获取用户上一个操作状态
	输入参数:	index 当前试题索引
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getLastState = function(index){
		return _arrAllTest[index].lastState;
	};
    /********************************************************************************
	函数名：getLastState
	功能：获取用户上一个操作状态
	输入参数:	index 当前试题索引
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getLastAction = function(index){
		return _arrAllTest[index].lastAction;
	};
	/********************************************************************************
	函数名：recoverAction
	功能：恢复用户之前的操作动作
	输入参数:	无
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.recoverAction = function(){
		for(var i = 0; i < _arrAllTest.length; i++){
			_arrAllTest[i].action = _arrAllTest[i].lastAction ;
		}
	};
    /********************************************************************************
	函数名：clearAction
	功能：清空用户之前的操作动作
	输入参数:	无
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.clearAction = function(){
		for(var i = 0; i < _arrAllTest.length; i++){
			_arrAllTest[i].action = '';
            _arrAllTest[i].lastAction = '';
		}
	};
	/********************************************************************************
	函数名：getAction
	功能：获取用户当前试题的操作动作
	输入参数:	index 当前试题索引
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
    this.getAction = function(index){
        return _arrAllTest[index].action;
    };
	/********************************************************************************
	函数名：setFav
	功能：设置用户是否收藏试题
	输入参数:	fav 收藏状态
	返回值：无
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.setFav = function (fav) {
		_arrAllTest[_index].fav = fav;
	};
	/********************************************************************************
	函数名：getFav
	功能：获取用户是否收藏试题
	输入参数:	index 试题数组索引
	返回值：试题收藏状态
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getFav = function (index) {
		return _arrAllTest[index].fav;
	};
	/********************************************************************************
	函数名：setUserNote
	功能：设置用户是否对试题做了笔记
	输入参数:	userNote 用户笔记
	返回值：无
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.setUserNote = function (userNote) {
		_arrAllTest[_index].userNote = userNote;
	};
	/********************************************************************************
	函数名：getUserNote
	功能：获取用户是否对试题做了笔记
	输入参数:	index 试题数组索引
	返回值：用户笔记
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getUserNote = function (index) {
		return _arrAllTest[index].userNote;
	};
	
    /********************************************************************************
	函数名：setTime
	功能：设置笔记时间
	输入参数:time  笔记时间
	返回值：无
	创建信息：韦友爱（2014-07-14）
	修改记录：无
	审查人：无
	*******************************************************************************/
    this.setTime = function (time) {
		_arrAllTest[_index].time = time;
	};
    /********************************************************************************
    函数名：getTestNO
    功能：生成包含题型以及该题型结束题号的数组
    输入参数: allTestID 试题编号
    返回值: 题号
    创建信息：韦友爱（2014-09-10）
    修改记录：无
    审查人：无
    *******************************************************************************/
	this.getTestNO=function(allTestID){
         if(!allTestID){
             return 1;
         }
         var arrContrast=_arrContrast;
         for(var i=0;i<arrContrast.length;i++){
             if(arrContrast[i]===allTestID){
                  return(i+1);
             }
         }
         return 1;
    }
    /********************************************************************************
	函数名：getTime
	功能：设置笔记时间
	输入参数:index  试题数组索引
	返回值：添加试题笔记时间
	创建信息：韦友爱（2014-07-14）
	修改记录：无
	审查人：无
	*******************************************************************************/
    this.getTime = function (index) {
		return _arrAllTest[index].time;
	};
	/********************************************************************************
	函数名：calculateScores
	功能：计算分数
	输入参数：无
	返回值：返回考试结果，考试结果有：未做试题数，试题总数、已做试题数、答对试题数、正确率、成绩评定
	创建信息：黎萍（2014-05-23）
	修改记录：兰涛（2014-05-27）修改函数名称
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.calculateScores = function () {
		var testCount = _arrAllTest.length; //试题总数
		var doneNum = 0; //已做试题数
		var rightNum = 0; //答对试题数
		var notDoNum = 0; //未做试题数
		var correctRate = 0; //正确率
		//计算用户的总得分和试题满分
		var allScore = 0;
		var userScore = 0;
		for (var i = 0; i < testCount; i++) {
			if (_arrAllTest[i].userReply !== '' && _arrAllTest[i].isRight !== false) {
				doneNum++; //获取已做总数
			}
			if (_arrAllTest[i].isRight === 0) { //答对
				rightNum++; //获取答对总数
			}
			allScore += Number(_arrAllTest[i].score);
			if (_arrAllTest[i].isRight === 0) { 
				userScore += Number(_arrAllTest[i].score);	//用户的得分
			}
		}
		notDoNum = testCount - doneNum; //计算未做总数
		if (doneNum > 0) {
			correctRate = rightNum / testCount;
			correctRate = correctRate.toFixed(2); //保留两位小数
		}		
			
		var scoreJSON = {doneNum:doneNum,rightNum:rightNum,correctRate:correctRate,testCount:testCount,notDoNum:notDoNum,allScore:allScore,userScore:userScore};
		return scoreJSON;
	};
	/********************************************************************************
	函数名：getTest
	功能：获取指定索引试题
	输入参数:	index 试题编号索引
	返回值：curTestShow 返回包含试题所有信息的结构体
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getTest = function (index) {
		var curTest = _arrAllTest[index];
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
        //如果超过了题目的索引返回null
        if(!curTest){
            return null;
        }
		var testType = _jsonAllTest.styleItems[curTest.styleItemIndex].Type; //根据试题编号获取试题所属题型
		var curTestShow = {};

		switch (testType) {
		case 'ATEST':
			curTestShow = _getAtest(curTest);
			break;
		case 'A3TEST':
			curTestShow = _getA3test(curTest);
			break;
		case 'BTEST':
			curTestShow = _getBtest(curTest);
			break;
		case 'JDTEST':
			curTestShow = _getJDtest(curTest);
			break;
		case 'PDTEST':
			curTestShow = _getPDtest(curTest);
			break;
		case 'TKTEST':
			curTestShow = _getTKtest(curTest);
			break;
		case 'XTEST':
			curTestShow = _getXtest(curTest);
			break;
		default:
			G_Prg.throwErr('程序运行错误，TestData.getTest：testType = "' + testType + '",无法解析数据');
		}
		return curTestShow;
	};
	/********************************************************************************
	函数名：getCurTest
	功能：获取当前试题
	输入参数:无
	返回值：curTestShow当前试题
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加注释，根据题型解析试题
	修改记录：黎萍（2014-06-26） 修改注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getCurTest = function () {
		return this.getTest(_index);
	};
    /********************************************************************************
    函数名：setMyNote
    功能：连接到setUserNote接口，设置当前试题的笔记内容
    输入参数: userID 用户ID,curTest 当前试题； note 笔记内容
    返回值：无
    创建信息：黎萍（2015-09-17）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.setMyNote = function(curTest,note,examID,userID) {
		var testID = curTest.sourceTestID; //题目ID
        var _this = this;
        if(note&&note.length>100){
            note=note.substr(0,100);
        }
    	var _success = function (jsonData) {
    		//var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
               if(note){
                   _this.setUserNote(note);
    			   _this.setTime('今天');
               }else{
                   _this.setUserNote(null);
               }	
    		} else if (jsonData.status === 201) {
    			G_Prg.throwErr('程序运行错误，testData.setMyNote：status=' + jsonData.status + '更新笔记失败');
    		} else {
    			G_Prg.throwErr('程序运行错误，不能处理，testData.setMyNote：status=' + jsonData.status);
    		}
    	}
    	var params = {
    		examID : curTest.examID?curTest.examID:examID,
    		userID : userID,
    		testID : testID,
    		noteContent : note
    	};
		if(!note){
			params = {
				examID : curTest.examID?curTest.examID:examID,
				userID : userID,
				testID : testID
			};
		}
    	G_AjaxApi2.post('/userGather/note/save', params, true, _success);
    }
     /********************************************************************************
     函数名：addFav
     功能：添加收藏
     输入参数:cb:执行成功后处理页面的回调函数
     返回值：无
     创建信息：韦友爱（2014-07-02）
     修改记录：黎萍（2014-07-04）修改提示信息
     审查人：无
     *******************************************************************************/
    this.addFav = function(curTest,examID,userID,isFav) {
        var _this = this;
        var dbSuccess = function(jsonData){
            //var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                _this.setFav(1);	//收藏成功，将收藏状态修改到结构体数组中，供给上一题、下一题使用
            }else if (jsonData.status === 201) {
                G_Prg.throwErr('程序运行错误，不能处理，testData.addFav：status=' + jsonData.status + '添加收藏失败');
            }else{
                G_Prg.throwErr('程序运行错误，不能处理，testData.addFav：status=' + jsonData.status);
            }
        }
		var testID = curTest.testID; //题目ID
		var params= {"examID":curTest.examID?curTest.examID:examID,"testID":curTest.sourceTestID,"isFav":isFav,"userID":userID};
	    G_AjaxApi2.post('/userGather/fav/save', params,true, dbSuccess);
        
    }
     /********************************************************************************
     函数名：addReplyLog
     功能：添加答题记录明细
     输入参数:curTest 当前试题,examID 考试id,userID 用户id,useuserAnswer 用户的答案,isRight标记用户是否回答正确
     返回值：无
     创建信息：黎萍（2015-09-17）
     修改记录：无
     审查人：无
     *******************************************************************************/
    this.addReplyLog = function(curTest,examID,userID,userAnswer,isRight){
		if(_isReplay){//还原现成，不提交答题明细
			return;
		}
        var testID = curTest.allTestID; //题目ID
		var isSubjectiveTest = 0;
		var type = curTest.testType;
		if(type==='TKTEST'||type==='JDTEST'){
			isSubjectiveTest = 1;
		}
		var params = {
			practiceID:G_Prg.getQueryString('practiceID'),
			testID:testID,
			childTestID:curTest.subTestID,
			isSubjectiveTest:isSubjectiveTest,
			anwerContent:userAnswer
		};
        G_AjaxApi.post('/student/practice/gather',params,true,function (json) {
			var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {	//200 获取数据成功
                return;
            }else{
				G_Prg.alert(jsonObj.msg);
			}
        });
    }
	/********************************************************************************
	 函数名：submit
	 功能：考试交卷
	 输入参数：examID 考试ID，submitJSON 用户答题试题json,useTime 考试用时
	 返回值：无
	 创建信息：韦友爱（2015-11-18）
	 修改记录：无
	 审查人：无
	 *******************************************************************************/
	this.submit=function(examID,submitJSON,useTime){
		var url = '/student/exam/submit';
		var params = {
			examID:examID,
			useTime:useTime,
			submitJSON:submitJSON
		};
		G_AjaxApi.post(url,params,false,function(json){
			var jsonData = JSON.parse(json);
			if(jsonData.status===200){
				G_Prg.alert('交卷成功');
			}else{
				G_Prg.alert(jsonData.msg);
			}
		});
	}
	/********************************************************************************
	 函数名_addReplyJson
	 功能：缓存试题并保存现场
	 输入参数:
	 返回值：无
	 创建信息：黎萍（2014-08-26）
	 修改记录：无
	 审查人：无
	 *******************************************************************************/
	this.addReplyJson = function (){
		var userID = G_Cookie.getUserID();
		if (!userID) {
			return;
		}
		if(_fromUrl!=='default.html'){
			return ;
		}
		var type = G_Prg.getQueryString('type');
		if(type){//笔记列表页
			return;
		}
		var examID = G_Prg.getQueryString('examID');
		var doneTest = this.calculateScores();
		//未做试题数量为0，说明试题已经做完了，不需要进行现场的恢复
		if(doneTest.notDoNum === 0){
			removeExamReply(examID,userID);
			return;
		}
		var testNO = this.getCurTest().testNO;

		var testJson = {
			paperTitle:_paperTitle,
			replyTime:new Date(),
			examID:examID,
			testNO:testNO,
			jsonAllTest : _jsonAllTest,
			arrAllTest :_arrAllTest
		};
		addExamReply(testJson,userID);
	}
	function addExamReply(data,userID){
		var examID = data.examID;
		var testNo = data.testNO;
		var valueName = userID+'_examReply';
		var examReplyJson = G_Storage.getLocalStorageValue(valueName);
		if(!examReplyJson){//之前无数据缓存
			var json = {
				data:[data]
			};
			json = JSON.stringify(json);
			G_Storage.setLocalStorageValue(valueName,json);
			return;
		}
		examReplyJson = JSON.parse(examReplyJson);
		var dataJson = examReplyJson.data;
		for(var i=0;i<dataJson.length;i++){
			if(dataJson[i].examID===examID){//之前已存在
				dataJson.splice(i, 1);//移除
				break;
			}
		}
		if(dataJson.length >= 10){
			dataJson.splice(0, 1);//移除
		}
		dataJson.push(data);
		examReplyJson.data = dataJson;
		G_Storage.setLocalStorageValue(valueName,JSON.stringify(examReplyJson));

	}
	function removeExamReply(examID,userID){
		var valueName = userID+'_examReply';
		var examReplyJson = G_Storage.getLocalStorageValue(valueName);
		if(!examReplyJson){//之前无数据缓存
			return;
		}
		examReplyJson = JSON.parse(examReplyJson);
		var dataJson = examReplyJson.data;
		for(var i=0;i<dataJson.length;i++){
			if(dataJson[i].examID===examID){//之前已存在
				dataJson.splice(i, 1);//移除
				break;
			}
		}

	}
}